'''
信号量（Semaphore）又称为 信号量，旗语
是一个同步对象，用于保持在0至指定最大值之间的一个计数值
- 当线程完成一次对该 semaphore 对象的等待（wait）时，该计数值减一；
- 当线程完成一次对semaphore 对象的释放（release）时，计数值加一。
- 当计数值为 0，则线程等待该 semaphore 对象不再能成功直至该 semaphore 对象变成 signaled 状态
- semaphore对象的计数值大于0，为 signaled 状态，计数值为 0，为 nonsignaled 状态 。

使用方式：
sem = asyncio.Semaphore(10)

# ...later
async with sem:
    # work with shared resource
'''

import asyncio
import aiohttp

semaphore = asyncio.Semaphore(10)

async def async_craw(url):
    async with semaphore:
        print('craw url: ', url)
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as response:
                result = await response.text()
                # 加入延时看效果，其他程序可不用加 等待 时间
                await asyncio.sleep(5)
                print(f'craw url: {url}, {len(result)}')


loop = asyncio.get_event_loop()

urls = [f"https://www.baidu.com/#p{page}" for page in range(1, 50+1)]
tasks = [loop.create_task(async_craw(url)) for url in urls]

import time
start = time.time()
loop.run_until_complete(asyncio.wait(tasks))
end = time.time()
print("use time cost: ", end - start, " seconds.")